﻿using System;

namespace Lesson6_索引器
{
    #region 回顾
    // 1.特征——成员变量
    // 2.行为——成员方法
    // 3.初始化——构造方法
    // 4.释放时调用——析构方法
    // 5.保护成员变量——成员属性
    #endregion

    #region 一 索引器基本概念
    //让对象可以像数组一样可以通过索引访问其中元素 使程序更直观 易编写
    #endregion
    
    class Person
    {
        public string name;
        private int age;
        private Person[] friends;
        private int[,] array = new int[3, 3];

        #region 二 索引器语法
        //访问修饰符 返回值 this[参数类型 参数名, 参数类型 参数名, ......]
        //{
        //     get{};
        //     set{};
        //}
        #endregion
        public Person this[int index]
        {
            get
            {
                #region 四 索引器中可以写逻辑
                if(friends == null || friends.Length - 1 < index)
                {
                    return null;
                }
                #endregion
                return friends[index];
            }
            set
            {
                #region 四 索引器中可以写逻辑
                if (friends == null)
                {
                    Console.WriteLine("数组为null,已自动申请数组并将值存放在首位");
                    friends = new Person[] { value };
                }
                else if(index > friends.Length - 1)
                {
                    //若数组越界，就进行数组扩容
                    Person[] temp = new Person[index + 1];
                    for(int i = 0;  i < temp.Length; i++)
                    {
                        temp[i] = friends[i];
                    }
                    friends = temp;
                    friends[index] = value;
                }
                else
                {
                    friends[index] = value;
                }
                #endregion
            }
        }
        #region 五 索引器可以重载
        //通过改变传入的参数进行重载
        public int this[int i, int j]
        {
            get
            {
                return array[i, j];
            }
            set
            {
                array[i, j] = value;
            }
        }
        #endregion
    }
    
    class Program
    {
        static void Main(string[] args)
        {
            Person p = new Person();
            #region 索引器使用
            //使用索引器便捷的对friends成员变量进行设置
            //通过注释说明索引器访问的变量
            p[0] = new Person();
            p[0].name = "LiberTy";
            //通过索引器进行取值
            Console.WriteLine(p[0].name);

            p[1, 2] = 99;
            Console.WriteLine(p[1, 2]);
            #endregion
        }
    }
    //总结：
    // 1.作用：用索引访问自定义类中的元素 规则自定
    //   适用于在类中有数组变量时使用 可以方便的进行访问和逻辑处理
    // 2.语法与属性类似
    // 3.结构体中可以写索引器
}